home *** CD-ROM | disk | FTP | other *** search
/ Programming in Microsoft Windows with C# / Programacion en Microsoft Windows con C#.iso / Codigo / El temporizador y la hora / JeuDeTaquin / JeuDeTaquin.cs next >
Encoding:
Text File  |  2002-07-15  |  4.4 KB  |  145 lines

  1. //------------------------------------------
  2. // JeuDeTaquin.cs ⌐ 2001 by Charles Petzold
  3. //------------------------------------------
  4. using System;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7.  
  8. class JeuDeTaquin: Form
  9. {
  10.      const int          nRows = 4;
  11.      const int          nCols = 4;
  12.      Size               sizeTile;
  13.      JeuDeTaquinTile[,] atile = new JeuDeTaquinTile[nRows, nCols];
  14.      Random             rand;
  15.      Point              ptBlank;
  16.      int                iTimerCountdown;
  17.  
  18.      public static void Main()
  19.      {
  20.           Application.Run(new JeuDeTaquin());
  21.      }
  22.      public JeuDeTaquin()
  23.      {
  24.           Text = "Jeu de Taquin";
  25.           FormBorderStyle = FormBorderStyle.Fixed3D;
  26.      }
  27.      protected override void OnLoad(EventArgs ea)
  28.      {
  29.                // Calcular el tama±o de las fichas del formulario.
  30.  
  31.           Graphics grfx = CreateGraphics();
  32.  
  33.           sizeTile   = new Size((int)(2 * grfx.DpiX / 3),
  34.                                 (int)(2 * grfx.DpiY / 3));
  35.           ClientSize = new Size(nCols * sizeTile.Width,
  36.                                 nRows * sizeTile.Height);
  37.           grfx.Dispose();
  38.  
  39.                // Crear las fichas.
  40.  
  41.           for (int iRow = 0; iRow < nRows; iRow++)
  42.           for (int iCol = 0; iCol < nCols; iCol++)
  43.           {
  44.                int iNum = iRow  * nCols + iCol + 1;
  45.  
  46.                if (iNum == nRows * nCols)
  47.                     continue;
  48.  
  49.                JeuDeTaquinTile tile = new JeuDeTaquinTile(iNum);
  50.                tile.Parent = this;
  51.                tile.Location = new Point(iCol * sizeTile.Width,
  52.                                          iRow * sizeTile.Height);
  53.                tile.Size = sizeTile;
  54.  
  55.                atile[iRow, iCol] = tile;
  56.           }
  57.           ptBlank = new Point(nCols - 1, nRows - 1);
  58.  
  59.           Randomize();
  60.      }
  61.      protected void Randomize()
  62.      {
  63.           rand = new Random();
  64.           iTimerCountdown = 64 * nRows * nCols;
  65.  
  66.           Timer timer    = new Timer();
  67.           timer.Tick    += new EventHandler(TimerOnTick);
  68.           timer.Interval = 1;
  69.           timer.Enabled  = true;
  70.      }
  71.      void TimerOnTick(object obj, EventArgs ea)
  72.      {
  73.           int x = ptBlank.X;
  74.           int y = ptBlank.Y;
  75.  
  76.           switch(rand.Next(4))
  77.           {
  78.           case 0:  x++;  break;
  79.           case 1:  x--;  break;
  80.           case 2:  y++;  break;
  81.           case 3:  y--;  break;
  82.           }
  83.           if (x >= 0 && x < nCols && y >= 0 && y < nRows)
  84.                MoveTile(x, y);
  85.  
  86.           if (--iTimerCountdown == 0)
  87.           {
  88.               ((Timer)obj).Stop();
  89.               ((Timer)obj).Tick -= new EventHandler(TimerOnTick);
  90.           }
  91.      }
  92.      protected override void OnKeyDown(KeyEventArgs kea)
  93.      {
  94.           if (kea.KeyCode == Keys.Left && ptBlank.X < nCols - 1)
  95.                MoveTile(ptBlank.X + 1, ptBlank.Y);
  96.  
  97.           else if (kea.KeyCode == Keys.Right && ptBlank.X > 0)
  98.                MoveTile(ptBlank.X - 1, ptBlank.Y);
  99.  
  100.           else if (kea.KeyCode == Keys.Up && ptBlank.Y < nRows - 1)
  101.                MoveTile(ptBlank.X, ptBlank.Y + 1);
  102.  
  103.           else if (kea.KeyCode == Keys.Down && ptBlank.Y > 0)
  104.                MoveTile(ptBlank.X, ptBlank.Y - 1);
  105.  
  106.           kea.Handled = true;
  107.      }
  108.      protected override void OnMouseDown(MouseEventArgs mea)
  109.      {
  110.           int x = mea.X / sizeTile.Width;
  111.           int y = mea.Y / sizeTile.Height;
  112.  
  113.           if (x == ptBlank.X)
  114.           {
  115.                if (y < ptBlank.Y)
  116.                     for (int y2 = ptBlank.Y - 1; y2 >= y; y2--)
  117.                          MoveTile(x, y2);
  118.  
  119.                else if (y > ptBlank.Y)
  120.                     for (int y2 = ptBlank.Y + 1; y2 <= y; y2++)
  121.                          MoveTile(x, y2);
  122.           }
  123.           else if (y == ptBlank.Y)
  124.           {
  125.                if (x < ptBlank.X)
  126.                     for (int x2 = ptBlank.X - 1; x2 >= x; x2--)
  127.                          MoveTile(x2, y);
  128.  
  129.                else if (x > ptBlank.X)
  130.                     for (int x2 = ptBlank.X + 1; x2 <= x; x2++)
  131.                          MoveTile(x2, y);
  132.           }
  133.      }
  134.      void MoveTile(int x, int y)
  135.      {
  136.           atile[y, x].Location = new Point(ptBlank.X * sizeTile.Width,
  137.                                            ptBlank.Y * sizeTile.Height);
  138.  
  139.           atile[ptBlank.Y, ptBlank.X] = atile[y, x];
  140.           atile[y, x] = null;
  141.           ptBlank = new Point(x, y);
  142.      }
  143. }
  144.  
  145.